import { propertyGather } from './property';

/**
 *  回填方法
 */
const backfillMethod = itemForm => {
  for (let item of itemForm.options) {
    if (!item['inputMethod']) {
      item.inputMethod = () => {};
    }
    if (!item['changeMethod']) {
      item.changeMethod = () => {};
    }

    Object.keys(item).forEach(key => {
      if (typeof item[key] === 'function') {
        // 如果已经包装过，则清除原函数引用，准备重新包装
        if (item[key].__isWrapped) {
          // 删除旧的包装函数引用（如果需要）
          delete item[key].__originalMethod;
        }
        console.log('????111');

        // 无论是否包装过，都重新赋值为最新的包装函数
        const originalMethod = item[key];

        item[key] = form => {
          originalMethod(form, itemForm);
          itemValueChange(itemForm);
        };

        // 标记为已包装，并保留原始方法用于调试或日志（可选）
        item[key].__isWrapped = true;
        item[key].__originalMethod = originalMethod;
      }
    });
  }
};

// 表单值变化
const itemValueChange = itemForm => {
  // 同步默认值，同于后续打开后可以获取到默认值
  for (let item of itemForm.options) {
    item.defaultValue = itemForm.form[item.prop];
  }
  mittBus.emit('crated-form-right', itemForm);
};

/** 初始话表单option属性 */
const initDefaultOptions = (item, flag?: boolean) => {
  let backOption = [];
  let defaultOp = propertyGather[item.type];

  // 存在itemOptions，则不使用默认值
  // 为了防止后续添加的属性但是 itemOptions又已经存在 查询一次把没有的属性添加到后面
  if (item?.itemOptions && !flag) {
    backOption = item.itemOptions;
    // 获取当前已有属性
    const existingProps = new Set(item.itemOptions.map(item => item.prop));
    for (let op of defaultOp) {
      if (!existingProps.has(op.prop)) {
        backOption.push(op);
      }
    }

    // 值和显示隐藏状态使用以前的，其余的值使用新的
    for (let item of backOption) {
      for (let deOp of defaultOp) {
        if (item.prop === deOp.prop) {
          const defaultValue = item.defaultValue;
          const hide = item.hide;
          Object.assign(item, deOp);
          item.defaultValue = defaultValue;
          item.hide = hide;
        }
      }
    }
    // console.log(backOption, 'backOption');
    arrSortItemsByName(backOption, 'sort');
    return backOption;
  }
  arrSortItemsByName(defaultOp, 'sort');

  return defaultOp;
};

export { backfillMethod, initDefaultOptions };
